package org.go.expcetion;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;

public class ValidationException extends Exception {
	/**
	 * 
	 */
	private static final long serialVersionUID = -2375264415340457748L;
	private Collection validationExceptions = new ArrayList();

	/**
	 * Constructor for ValidationException.
	 */
	public ValidationException() {
		super();
	}

	/**
	 * Constructor for ValidationException.
	 * 
	 * @param errors
	 *          collection of validation exceptions.
	 */
	public ValidationException(Collection<Exception> errors) {
		this();
		this.validationExceptions = Collections.unmodifiableCollection(validationExceptions);
		initCause(errors.iterator().next());
	}

	/**
	 * Constructor for ValidationException.
	 * 
	 * @param message
	 *          exception message.
	 */
	public ValidationException(String message) {
		super(message);
	}

	/**
	 * Constructor for ValidationException.
	 * 
	 * @param message
	 *          exception message.
	 * @param errors
	 *          collection of validation exceptions.
	 */
	public ValidationException(String message, Collection<Exception> errors) {
		this(message);
		this.validationExceptions = Collections.unmodifiableCollection(validationExceptions);
		initCause(errors.iterator().next());
	}

	/**
	 * Returns the detail message string.
	 * 
	 * @return the detail message string.
	 */
	@Override
	public String getMessage() {
		if (getValidationExceptions().size() == 0) {
			return super.getMessage();
		}

		StringBuffer sb = new StringBuffer();

		boolean first = true;

		for (Iterator iter = getValidationExceptions().iterator(); iter.hasNext();) {
			Exception e = (Exception) iter.next();

			if (!first) {
				sb.append('\n');
				first = false;
			}

			sb.append(e.getMessage());
		}

		return sb.toString();
	}

	/**
	 * Returns collection of errors.
	 * 
	 * @return collection of errors.
	 */
	public Collection getValidationExceptions() {
		return validationExceptions;
	}
}
